package com.example.rxjavademo1.views;


import com.example.rxjavademo1.R;
import com.example.rxjavademo1.base.BaseActivity;
import com.example.rxjavademo1.utils.LogUtils;

import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;

public class MainActivity extends BaseActivity {
    private Observable<String> mObservable;
    private Observer<String> mObserver;
    private Observer<String> mObserver2;

    @Override
    public int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public void init() {
        initObservable();
        initObserver();
        mObservable.subscribe(mObserver);
        mObservable.subscribe(mObserver2);
    }

    private void initObservable() {
        //create：手动创建一个 Observable。
        mObservable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                //重写subscribe()定义需要发送的事件
                //ObservableEmitter有三种发射方法，onNext()、onComplete()、onError()
                //onNext()发送事件，可以无限调用，所有的发射信息观察者都可以收得到
                emitter.onNext("电视剧第一集");
                emitter.onNext("电视剧第二集");
                emitter.onNext("电视剧第三集");
                //onComplete()、onError()是互斥的，观察者只会收到一个
                //onComplete()完成事件发送，可以重复调用，但是观察者只会接收一次
                emitter.onComplete();
                //onError()异常发送，不可以重复调用
                //emitter.onError(new IllegalArgumentException("TV Play Exception!"));
            }
        });

        //just:创建一个发射指定数据项的 Observable
        //mObservable = Observable.just("电视剧第一集", "电视剧第二集", "电视剧第三集");
    }

    /**
     * 创建观察者
     */
    private void initObserver() {
        mObserver = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                LogUtils.d("asdf", "onSubscribe");
            }

            @Override
            public void onNext(@NonNull String s) {
                LogUtils.d("asdf", "onNext : " + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                LogUtils.d("asdf", "onError");
            }

            @Override
            public void onComplete() {
                LogUtils.d("asdf", "onComplete");
            }
        };

        mObserver2 = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                LogUtils.d("asdf", "2 onSubscribe");
            }

            @Override
            public void onNext(@NonNull String s) {
                LogUtils.d("asdf", "2 onNext : " + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                LogUtils.d("asdf", "2 onError");
            }

            @Override
            public void onComplete() {
                LogUtils.d("asdf", "2 onComplete");
            }
        };
    }
}